﻿/*
padrao:
*/

---# TODO:
/*
Tabela: Profissao
Qando: insert, update
a descricao da profissao nao pode repetir. (case sensitive)
*/
create or replace function fn_verifica_nome() returns trigger as
$$
DECLARE 
BEGIN
	--RAISE NOTICE 'ta inserindo: %', new.descricao;
	PERFORM * from profissao where lower(descricao) = lower(new.descricao) and new.codProfissao <> codProfissao;
	if (FOUND) then
		rollback;
		return null;
	else 
		return new;
	end if;	
END;
$$ language plpgsql;
/* TESTE da trigger
begin 
select * from profissao 
delete from profissao where codprofissao = 9
INSERT INTO Profissao(Descricao, AreaCodArea) VALUES ('Analista de Sistemas', 1);
rollback
--*/
create trigger tg_verifica_nome before insert or update
on Profissao for each row execute procedure fn_verifica_nome();



/*
Tabela: ClientesProfissional
Qando: insert,update,delete
atualizar o nivel do Profissional (em Especializacao) fazendo a media dos valores do Nivel de ClientesProfissional.
Criado por Márcio
*/

create or replace function AtualizaNivelProfissional() returns trigger as
$AtualizaNivelProfissional$
	declare
		profissao int;
	begin
		if new.nivel <> old.nivel then
			select into profissao profissaocodprofissao
			from solicitacao
			where codsolicitacao = new.solicitacaocodsolicitacao;
	
			update especializacao set nivel = (select avg(new.nivel) 
								from clientesprofissional cp, solicitacao s
								where s.profissaocodprofissao = profissao and
								cp.profissionalcodprofissional = new.profissionalcodprofissional and
								cp.aceito = 'true')
			where especializacao.profissionalcodprofissional = new.profissionalcodprofissional and
				especializacao.profissaocodprofissao = profissao;
		end if;
		return new;
	end;
$AtualizaNivelProfissional$ language plpgsql;

create trigger GeraAtualizacaoNivelProfissional before update
on ClientesProfissional for each row execute procedure
AtualizaNivelProfissional();

/*
Tabela: Users
Qando: insert, update se senha = NULL
Gerar Senha para novo usuário
Criado por Márcio
*/

create or replace function GeraSenhaUsuario() returns trigger as
$GeraSenhaUsuario$
	declare
		password varchar(10);
		sequencia char(62);
		letra char;
	begin

		if new.senha = '' then
			password='';
			select into letra substr(sequencia,(round(random()*62))::int,1);
			for i in 1..10 loop
				select INTO letra substr('aAbB0cCdD1eEfF2gGhH3iIjJ4kKlL5mMnN6oOpP7qQrRs8StTu9UwWx0XyYzZ1',(round(random()*62))::int,1);
				password:=password || letra;
			end loop;
			update users set senha=password where id = new.id;
		end if;
		return new;
	end;
$GeraSenhaUsuario$ language plpgsql;

create trigger tg_GeraSenhaUsuario after insert or update
on Users for each row execute procedure
GeraSenhaUsuario();


/*
Tabela: ClientesProfissional
Quando: Insert, Update
atualizar o estado do Profissional (alocado) de acordo com o Aceito em ClientesProfissional

*/

create or replace function AtualizaAlocacaoProfissional() returns trigger as
$$
	declare
	begin
	
		update profissional set alocado=new.aceito where codprofissional = new.profissionalcodprofissional;
		
		if (new.aceito) then
--			RAISE NOTICE 'update solicitacao set DataAtendimento = % where codsolicitacao = %;', current_date, new.SolicitacaoCodSolicitacao;
			update solicitacao set DataAtendimento = current_date where codsolicitacao = new.SolicitacaoCodSolicitacao;
		end if;

		return new;
	end;
$$ language plpgsql;

create trigger tg_AtualizaAlocacaoProfissional after insert or update
on ClientesProfissional for each row execute procedure
AtualizaAlocacaoProfissional();
/* teste da trigger
begin 
SELECT * FROM fn_inserir_solicitacao (7,ARRAY[1])

select * from solicitacao
select * from ClientesProfissional
select * from vw_cliente_profissional
rollback
--*/
